package com.star.star.controller;

import cn.hutool.core.util.BooleanUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.star.core.base.BaseController;
import com.star.mentor.dto.StarAdDTO;
import com.star.star.vo.StarDetailWxmentorVO;
import com.star.security.annotations.Authorize;
import com.star.star.dto.*;
import com.star.star.service.*;
import com.star.star.vo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 艺人
 *
 * @author yangzj
 */
@RestController
@RequestMapping("/star")
public class StarController extends BaseController {

    @Autowired
    private StarService starService;
    @Autowired
    private StarCollectService starCollectService;
    @Autowired
    private StarSupportService starSupportService;
    @Autowired
    private StarAdService starAdService;
    @Autowired
    private StarIntroductionReadService starIntroductionReadService;

    /**
     * 更新启用
     *
     * @param id      ID
     * @param enabled 启用
     */
    @Authorize("star:enabled")
    @PutMapping("/enabled/{id}/{enabled}")
    public void updateEnabled(@PathVariable("id") Long id, @PathVariable("enabled") boolean enabled) {
        starService.updateEnabled(id, enabled);
    }

    /**
     * 更新签约
     *
     * @param id        ID
     * @param isSigning 是否签字
     */
    @Authorize("star:signing")
    @PutMapping("/signing/{id}/{isSigning}")
    public void updateSigning(@PathVariable("id") Long id, @PathVariable("isSigning") boolean isSigning) {
        starService.updateSigning(id, isSigning);
    }

    /**
     * 分页
     *
     * @param dto 入参
     * @return {@link IPage}<{@link StarPageVO}>
     */
    @Authorize("star:page")
    @PostMapping("/page")
    public IPage<StarPageVO> page(@Validated @RequestBody StarPageDTO dto) {
        return starService.page(dto);
    }

    /**
     * 获取详情
     *
     * @param id ID
     * @return {@link StarDetailVO}
     */
    @Authorize("star:page")
    @PostMapping("/{id}")
    public StarDetailVO getDetail(@PathVariable("id") Long id){
        return starService.getDetail(id);
    }

    /**
     * 审核分页
     *
     * @param dto 入参
     * @return {@link IPage}<{@link StarFileAuditPageVO}>
     */
    @Authorize("star:audit")
    @PostMapping("/audit/page")
    public IPage<StarFileAuditPageVO> auditPage(@Validated @RequestBody StarFileAuditPageDTO dto) {
        return starService.auditPage(dto);
    }

    /**
     * 获取审核详情
     *
     * @param id ID
     * @return {@link StarFileAuditDetailVO}
     */
    @Authorize("star:audit")
    @GetMapping("/audit/detail/{id}")
    public StarFileAuditDetailVO getAuditDetail(@PathVariable("id") Long id) {
        return starService.getAuditDetail(id);
    }

    /**
     * 审核文件
     *
     * @param dto 入参
     */
    @Authorize("star:audit")
    @PutMapping("/audit")
    public void auditFile(@Validated @RequestBody StarFileAuditDTO dto) {
        starService.auditFile(dto);
    }

    /**
     * 获取分析
     *
     * @param id ID
     * @return {@link StarAnalysisVO}
     */
    @GetMapping("/analysis/{id}")
    public StarAnalysisVO getAnalysis(@PathVariable("id") Long id){
        return starService.getAnalysis(id);
    }


    /**
     * 推广
     *
     * @param dto 入参
     */
    @Authorize("star:ad")
    @PostMapping("/ad")
    public void adSaveOrUpdate(@Validated @RequestBody StarAdDTO dto) {
        starAdService.saveOrUpdate(dto);
    }

    /**
     * 推广详情
     *
     * @param starId 艺人ID
     * @return {@link StarAdDTO}
     */
    @Authorize("star:ad")
    @GetMapping("/ad/{starId}")
    public StarAdDTO getAdDetail(@PathVariable("starId") Long starId){
        return starAdService.getDetail(starId);
    }

    //-------------------- 以下微信小程序（用户端）接口 --------------------

    /**
     * 保存基本信息-微信小程序（用户端）
     *
     * @param dto 入参
     */
    @Authorize("wxuser")
    @PostMapping("/wxuser/base-info")
    public Long saveBaseInfoWxuser(@Validated @RequestBody StarSaveWxuserDTO dto) {
        return starService.saveBaseInfoWxuser(dto, getUserId());
    }

    /**
     * 更新基本信息-微信小程序（用户端）
     *
     * @param dto 入参
     */
    @Authorize("wxuser")
    @PutMapping("/wxuser/base-info")
    public void updateBaseInfoWxuser(@Validated @RequestBody StarUpdateWxuserDTO dto) {
        starService.updateBaseInfoWxuser(dto, getUserId());
    }

    /**
     * 获取基础信息-微信小程序（用户端）
     *
     * @param id ID
     * @return {@link StarBaseInfoWxuserVO}
     */
    @Authorize("wxuser")
    @GetMapping("/wxuser/base-info/{id}")
    public StarBaseInfoWxuserVO getBaseInfoWxuser(@PathVariable("id") Long id) {
        return starService.getBaseInfoWxuser(id, getUserId());
    }

    /**
     * 更新自我介绍-微信小程序（用户端）
     *
     * @param dto 入参
     */
    @Authorize("wxuser")
    @PutMapping("/wxuser/introduction")
    public void updateIntroductionWxuser(@Validated @RequestBody StarIntroductionUpdateWxuserDTO dto) {
        starService.updateIntroductionWxuser(dto, getUserId());
    }

    /**
     * 获取自我介绍-微信小程序（用户端）
     *
     * @param id ID
     * @return {@link String}
     */
    @Authorize("wxuser")
    @PutMapping("/wxuser/introduction/{id}")
    public String getIntroductionWxuser(@PathVariable("id") Long id) {
        return starService.getIntroductionWxuser(id, getUserId());
    }

    /**
     * 分页-微信小程序（用户端）
     *
     * @param dto 入参
     * @return {@link IPage}<{@link StarArtPageWxuserVO}>
     */
    @Authorize("wxuser")
    @PostMapping("/wxuser/page")
    public IPage<StarPageWxuserVO> pageWxuser(@RequestBody StarPageWxuserDTO dto) {
        return starService.pageWxuser(dto.setUserId(getUserId()));
    }

    /**
     * 获取详情-微信小程序（用户端）
     *
     * @param id ID
     * @return {@link StarBaseInfoWxuserVO}
     */
    @Authorize("wxuser")
    @GetMapping("/wxuser/{id}")
    public StarDetailWxuserVO getDetailWxuser(@PathVariable("id") Long id) {
        return starService.getDetailWxuser(id, getUserId());
    }

    /**
     * 已读个人介绍-微信小程序
     *
     * @param starId 艺人ID
     */
    @Authorize({"wxuser","wxmentor"})
    @PutMapping("/wxapp/introduction-read/{starId}")
    public void introductionRead(@PathVariable("starId") Long starId){
        starIntroductionReadService.read(starId, getUserId());
    }

    /**
     * 支持-微信小程序（用户端）
     *
     * @param id      ID
     * @param support true=支持 false=取消支持
     */
    @Authorize("wxuser")
    @PostMapping("/wxuser/like/{id}/{support}")
    public void supportOrCancel(@PathVariable("id") Long id, @PathVariable("support") boolean support) {
        starSupportService.saveOrDelete(id, support, getUserId());
    }

    /**
     * 收藏-微信小程序（用户端）
     *
     * @param id      ID
     * @param collect true=收藏 false=取消收藏
     */
    @Authorize("wxuser")
    @PostMapping("/wxuser/collect/{id}/{collect}")
    public void collectOrCancel(@PathVariable("id") Long id, @PathVariable("collect") boolean collect) {
        starCollectService.saveOrDelete(id, collect, getUserId());
    }

    //-------------------- 以下微信小程序（导师端）接口 --------------------

    /**
     * 获取详情-微信小程序（导师端）
     *
     * @param id ID
     * @return {@link StarDetailWxmentorVO}
     */
    @Authorize("wxmentor")
    @GetMapping("/wxmentor/{id}")
    public StarDetailWxmentorVO getDetailWxmentor(@PathVariable("id") Long id) {
        return starService.getDetailWxmentor(id, getUserId());
    }

    //-------------------- 以下web接口 --------------------


    /**
     * 人气艺人列表
     *
     * @param limit 限制几条
     * @return {@link List}<{@link StarListVO}>
     */
    @GetMapping("/web/list-top/{limit}")
    public List<StarListVO> listWebTop(@PathVariable("limit") int limit){
        return starService.listWebTop(limit);
    }

    /**
     * web分页
     *
     * @param dto 入参
     * @return {@link IPage}<{@link StarPageWebVO}>
     */
    @PostMapping("/web/page")
    public IPage<StarPageWebVO> pageWeb(@Validated @RequestBody StarPageWebDTO dto){
        return starService.pageWeb(dto);
    }

    /**
     * web分页-需要登录
     *
     * @param dto 入参
     * @return {@link IPage}<{@link StarPageWebVO}>
     */
    @PostMapping("/web-auth/page")
    public IPage<StarPageWebVO> pageWebAuth(@Validated @RequestBody StarPageWebDTO dto){
        if(BooleanUtil.isTrue(dto.getIsCollect())) {
            dto.setUserId(getUserId());
        }
        return starService.pageWeb(dto);
    }

    /**
     * 获取web详情
     *
     * @param id ID
     * @return {@link StarDetailWebVO}
     */
    @GetMapping("/web/{id}")
    public StarDetailWebVO getDetailWeb(@PathVariable("id") Long id){
        return starService.getDetailWeb(id);
    }

}
